package com.evosoft.service;

import javax.persistence.EntityManager;

import com.evosoft.dao.DAOFactory;
//import com.evosoft.enumeration.RolEnum;
import com.evosoft.enumeration.TipoEmpresaEnum;
import com.evosoft.excepciones.NotEntityFoundException;
import com.evosoft.excepciones.CantCreateUpdate;
import com.evosoft.model.Empresa;
import com.evosoft.model.Persona;
import com.evosoft.model.Tipo;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Persistence;


public class EmpresaService {
	
	private static EmpresaService instance;

    private EmpresaService() {
    }

    public synchronized static EmpresaService getInstance() {
        if (instance == null) {
            instance = new EmpresaService();
        }

        return instance;
    }
	
    
    public void crearEmpresa(Empresa empresa, Integer id, EntityManager em) throws NotEntityFoundException, CantCreateUpdate  {
		
		Persona admin = DAOFactory.getInstance().getPersonaDAO().findById(id, em);
                //if(admin.getRol().getId() != RolEnum.ADMINISTRADOR.getCodigo()) {
                
                //Se pregunta si es un administrador con permisos para poder crear empresas
                /*if(admin.getRol().getCreaEmpresa() == false) {
                        throw (new CantCreateUpdate());
                }*/
		Empresa empresaAdmin = admin.getEmpresa();
		if(admin != null) {
                        //Se pregunta ss el administrador de la empresa administradora del sistema.
			if(empresaAdmin.getId() == 1) {
				empresa.setTipo(new Tipo(TipoEmpresaEnum.DISTRIBUIDOR));
			}
			else {
				int tipoEmpresa = empresaAdmin.getTipo().getId();
				if(tipoEmpresa == TipoEmpresaEnum.DISTRIBUIDOR.getCodigo()) {
					empresa.setTipo(new Tipo(TipoEmpresaEnum.SUBDISTRIBUIDOR));
				}
				if(tipoEmpresa == TipoEmpresaEnum.SUBDISTRIBUIDOR.getCodigo()) {
					empresa.setTipo(new Tipo(TipoEmpresaEnum.CANAL));
				}
				if(tipoEmpresa == TipoEmpresaEnum.CANAL.getCodigo()) {
					empresa.setTipo(new Tipo(TipoEmpresaEnum.PTOVENTA));
				}
			}
			
		    DAOFactory.getInstance().getEmpresaDAO().create(empresa, em);
		}
	}

    public Empresa buscarEmpresaPorId(Integer id, EntityManager em) throws NotEntityFoundException {
        Empresa empresa = null;
        empresa = DAOFactory.getInstance().getEmpresaDAO().findById(id, em);
        return empresa;
    }

    public List<Empresa> obtenerEmpresas(Integer id, EntityManager em) throws NotEntityFoundException {
        List<Empresa> empresasDependientes = new ArrayList<Empresa>();
        empresasDependientes = DAOFactory.getInstance().getEmpresaDAO().obtenerEmpresas(id, em);
        return empresasDependientes;
    }
    
    public List<Empresa> obtenerEmpresasDependientes(Integer id, EntityManager em) throws NotEntityFoundException {
        List<Empresa> empresasDependientes = new ArrayList<Empresa>();
        empresasDependientes = DAOFactory.getInstance().getEmpresaDAO().obtenerEmpresasDependientes(id, em);
        return empresasDependientes;
    }

    public void actualizarEmpresa(Empresa empresa, int id, EntityManager em) throws NotEntityFoundException, CantCreateUpdate {
        Persona admin = DAOFactory.getInstance().getPersonaDAO().findById(id, em);
        if(admin.getRol().getCreaEmpresa() == true) {
            DAOFactory.getInstance().getEmpresaDAO().update(empresa, em);
        }
        else throw (new CantCreateUpdate());
    }

    public void eliminarEmpresa(Integer idEmpresa, Integer idPersona, EntityManager em) throws NotEntityFoundException, CantCreateUpdate {
        Persona admin = DAOFactory.getInstance().getPersonaDAO().findById(idPersona, em);
        if(admin.getRol().getCreaEmpresa() == true) {
            //Antes de eliminar la empresa se deben eliminar los usuarios de la empresa
            List<Persona> personasEliminar = ServiceFactory.getInstance().getPersonaService().obtenerPorEmpresa(idEmpresa, em);
            EntityManager em1 = Persistence.createEntityManagerFactory("bienestarPU").createEntityManager();
            em1.getTransaction().begin();
            for(Persona p : personasEliminar) {
                DAOFactory.getInstance().getPersonaDAO().delete(p, em);
            }
            em1.getTransaction().commit();
            Empresa empresa = DAOFactory.getInstance().getEmpresaDAO().findById(idEmpresa, em);
            DAOFactory.getInstance().getEmpresaDAO().delete(empresa, em);
        }
        else throw (new CantCreateUpdate());
        
        
    }

    public int ultimaEmpresaCreada(EntityManager em) {
        int empresaId = DAOFactory.getInstance().getEmpresaDAO().obtenerUltimaEmpresaCreada(em);
        return empresaId;
    }

    public Empresa obtenerEmpresaPorNit(String nit, EntityManager em) throws NotEntityFoundException {
        Empresa empresa = null;
        empresa = DAOFactory.getInstance().getEmpresaDAO().obtenerEmpresaPorNit(nit, em);
        return empresa;        
    }

   
	

}
